<!DOCTYPE html>
<title>Comparing identical custom property sets</title>
<script src="../resources/runner.js"></script>
<script src="resources/utils.js"></script>
<main id=main></main>
<script>
  const PROP_COUNT = 1000;
  const TOKEN_COUNT = 3000; // Per custom property.
  const NODE_COUNT = 20000;

  // Generate declarations with values that have many tokens (i.e. values
  // that would be expensive to call StyleVariables::operator== on).
  //
  // --x0:X X X ... 0
  // --x1:X X X ... 1
  // ...
  let base_value = 'X '.repeat(TOKEN_COUNT / 2);
  let declaration_array = [];
  for (let i = 0; i < PROP_COUNT; i++) {
    let value = base_value + i.toString(); // Make value unique.
    declaration_array.push(`--x${i}:${value};`);
  }

  // Generate two rules which produce identical StyleVariables objects.
  // It's important that they are identical, so that StyleVariables::operator==
  // has to take the slowest possible path.
  let declarations = declaration_array.join('\n');
  applyCSSRule(`#main { ${declarations} }`);
  applyCSSRule(`#main.change { ${declarations} }`);

  createDOMTree(main, NODE_COUNT, 1 /* siblings */);

  PerfTestRunner.measureTime({
    description: 'Comparing identical custom property sets',
    run: function() {
      forceStyleRecalc(main);
      main.classList.toggle('change');
      forceStyleRecalc(main);
    }
  });
</script>
